package com.agua.enturno.vista.dto.assemblers;

import com.agua.enturno.excepciones.ExcepcionDeReglaDelNegocio;
import com.agua.enturno.modelo.agenda.JornadaLaboralOcasional;
import com.agua.enturno.vista.dto.JornadaLaboralOcasionalDTO;
import org.joda.time.Interval;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

public class JornadaLaboralOcasionalAssembler extends NullAwareSimpleAssembler<JornadaLaboralOcasional, JornadaLaboralOcasionalDTO> {

	@Override
	protected JornadaLaboralOcasionalDTO internalAssemble(JornadaLaboralOcasional jornadaOcasional) {
		return new JornadaLaboralOcasionalDTO(
				jornadaOcasional.getAgenda().getId(),
				jornadaOcasional.getId(), 
				jornadaOcasional.getIntervalo().getStart(), 
				jornadaOcasional.getIntervalo().getEnd(), 
				jornadaOcasional.getDuracionDeLosTurnos(), 
				jornadaOcasional.getVacantesPorTurno());
	}

	@Override
	protected JornadaLaboralOcasional internalDisassemble(JornadaLaboralOcasionalDTO jornadaOcasionalDTO) 
			throws ExcepcionDeReglaDelNegocio {
		
		try {
			
			Interval intervalo = new Interval(jornadaOcasionalDTO.getInicio(), jornadaOcasionalDTO.getFin());
			
			return new JornadaLaboralOcasional(
					intervalo,
					jornadaOcasionalDTO.getDuracionDeLosTurnos(),
					jornadaOcasionalDTO.getVacantesPorTurno());
			
		} catch (IllegalArgumentException e) {
			throw new ExcepcionDeReglaDelNegocio("El fin de la jornada debe ser posterior al inicio de la mísma");
		}
	}
	
	public List<JornadaLaboralOcasionalDTO> assemble(Set<JornadaLaboralOcasional> jornadasOcasionales) {
		
		List<JornadaLaboralOcasionalDTO> jornadasOcasionalesDTO = new ArrayList<JornadaLaboralOcasionalDTO>();
		
		for (JornadaLaboralOcasional jornadaOcasional : jornadasOcasionales) 
			jornadasOcasionalesDTO.add(assemble(jornadaOcasional));
		
		return jornadasOcasionalesDTO;
	}
	
}
